package com.model.attributes;

import com.model.structure.OpcodeAndOperand;
import lombok.Data;

import java.util.List;

/**
 * Code属性
 * @author seven
 */
@Data
public class CodeAttributesInfo extends AttributesInfo{
    private int attributeNameLen=2;
    /**
     * 该attribute_name_index项目的值 必须是constant_pool表中的有效索引。
     * 该constant_pool索引处的条目必须是表示字符串“ ”的CONSTANT_Utf8_info结构（第4.4.7节）Code。
     */
    private Integer attributeNameIndex;
    private int attributeLengthLen=4;
    /**
     * 项目的值 attribute_length表示属性的长度，不包括前六个字节。
     */
    private int attributeLength;
    private int maxStackLen=2;
    /**
     * 项目的值 max_stack给出了该方法执行过程中任何时候该方法的操作数堆栈的最大深度（第2.6.2节）。
     */
    private Integer maxStack;
    private int maxLocalsLen=2;
    /**
     * 项目的值 max_locals给出在调用此方法时分配的局部变量数组中的局部变量的数量，包括用于在调用该方法时将参数传递给该方法的局部变量。
     * 对于类型的值的最大局部变量索引long或double是 max_locals - 2。任何其他类型的值的最大局部变量索引为max_locals - 1。
     */
    private Integer maxLocals;
    private int codeLengthLen=4;
    /**
     * 项目的值 code_length给出code此方法在数组中的字节数。
     * 的值code_length必须大于零（因为code数组不能为空）且小于65536。
     */
    private Integer codeLength;
    /**
     * 该code数组提供实现该方法的Java虚拟机代码的实际字节。
     * 当将code数组读入可字节寻址的计算机的内存中时，如果数组的第一个字节在4字节边界上对齐，
     * 则tableswitch和 lookupswitch的32位偏移量将是4字节对齐。（有关code阵列对齐的结果的更多信息，请参阅这些指令的描述。）
     * 对code数组内容的详细约束是广泛的，并在单独的部分（第4.9节）中给出。
     */
    private List<OpcodeAndOperand> codes;
    private int exceptionTableLengthLen=2;
    /**
     * 该exception_table_length项目的值 给出了表中的条目数exception_table
     */
    private Integer exceptionTableLength;
    /**
     * exception_table数组中的每个条目都描述了 数组中的一个异常处理程序code。exception_table数组中处理程序的顺序很重要（第2.10节）。
     */
    private List<Exceptions> exceptionTable;
    private int attributesCountLen=2;
    /**
     * 项目的值 attributes_count指示属性的Code属性数量
     */
    private Integer attributesCount;
    /**
     * 该attributes表的每个值都 必须是一个attribute_info结构（第4.7节）。
     * 一个Code属性可以具有与之关联的任意数量的可选属性。
     * 表4.7-C中列出了 由本规范定义的出现在属性attributes表中的Code属性 。
     * §4.7中给出了 有关定义为出现在 属性attributes表中的Code属性的 规则。
     * 第4.7.1节中给出了 有关属性attributes表中非预定义属性的规则 。 Code
     */
    private List<AttributesInfo> infoList;

}
